const jwt = require('jsonwebtoken');
const User = require('../models/User');
const redisClient = require('../config/redis');

const ignoreAuthUris = [
  '/api/auth/login', // 登录接口
  '/api/captcha', // 状态检查接口 (示例)
  // ... 其他需要忽略的 URI ...
];

module.exports = async (req, res, next) => {
  // 检查 URI 是否在忽略列表中
  if (ignoreAuthUris.includes(req.path)) {
    return next();
  }

  // 获取 token
  const token = req.header('Authorization');
  if (!token) {
    return res.status(401).json({ message: '未授权' });
  }

  try {
    // 验证 token 并获取用户信息
    const decoded = jwt.verify(token, process.env.JWT_SECRET);

    // 从 Redis 中获取用户信息
    const cachedUser = await redisClient.get(`user:${decoded.userId}`);

    if (cachedUser) {
      // 如果缓存存在，检查 token 是否即将过期
      const now = Date.now() / 1000;
      const refreshThreshold = 3600; // 刷新阈值，例如 1 小时

      if (decoded.exp - now < refreshThreshold) {
        // 生成新的 token，延长过期时间
        const newToken = jwt.sign({ userId: decoded.userId }, process.env.JWT_SECRET, { expiresIn: process.env.JWT_EXPIRES_IN * 1000 });
        res.setHeader('Authorization', newToken); // 将新的 token 设置到响应头中

        // 更新 Redis 缓存中的 token 和过期时间
        await redisClient.set(`user:${decoded.userId}`, JSON.stringify(req.user), 'EX', process.env.JWT_EXPIRES_IN);
      }

      req.user = JSON.parse(cachedUser);
      return next();
    } else {
      // 如果缓存不存在，说明 token 已过期或无效
      return res.status(401).json({ message: 'token 无效或已过期' });
    }
  } catch (err) {
    // 捕获 token 验证错误
    return res.status(401).json({ message: 'token 无效或已过期' });
  }
};